MongoDB学习(六)一一MongoDB 正则表达式与GridFS

MongoDB 正则表达式

MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。
MongoDB使用PCRE (Perl Compatible Regular Expression) 作为正则表达式语言。
不同于全文检索,我们使用正则表达式不需要做任何配置。
考虑以下 mongo 集合的文档结构,该文档包含了文章内容和标签:

1
2
3
4
5
6
7
8
9
> db.mongo.insert(
... {
... "post_text": "enjoy the mongodb articles",
... "tags": [
... "mongodb",
... "kelele67"
... ]
... })
WriteResult({ "nInserted" : 1 })

使用正则表达式

使用正则表达式查找包含 mongodb 字符串的文章:

1
2
> db.mongo.find({post_text:{$regex:"mongodb"}})
{ "_id" : ObjectId("590bde7964d6ed405ce2ada1"), "post_text" : "enjoy the mongodb articles", "tags" : [ "mongodb", "kelele67" ] }

如果要使用不区分大小写的表达式,则需要用到options i:

1
2
> db.mongo.find({post_text:{$regex:"MongoDB",$options:"$i"}})
{ "_id" : ObjectId("590bde7964d6ed405ce2ada1"), "post_text" : "enjoy the mongodb articles", "tags" : [ "mongodb", "kelele67" ] }

在数组元素使用正则表达式:

1
2
> db.mongo.find({tags:{$regex:"kelele67"}})
{ "_id" : ObjectId("590bde7964d6ed405ce2ada1"), "post_text" : "enjoy the mongodb articles", "tags" : [ "mongodb", "kelele67" ] }

优化正则表达式操作

  • 如果你的文档中字段设置了索引,那么使用索引相比于正则表达式匹配查找所有的数据查询速度更快

  • 如果正则表达式是前缀表达式,所有匹配的数据将以指定的前缀字符串为开始。例如: 如果正则表达式为 ^tut ,查询语句将查找以 tut 为开头的字符串

使用正则表达式要注意的地方

正则表达式中使用变量。一定要使用eval将组合的字符串进行转换,不能直接将字符串拼接后传入给表达式。否则没有报错信息,只是结果为空!实例如下:

1
>var name = eval("/" + 变量值key + "/i");

模糊查询包含title关键词, 且不区分大小写:

1
title:eval("/"+title+"/i") //相当于 title:{$regex:title,$option:"$i"}

MongDB GridFS

  • GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)

  • GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中

  • GridFS 可以更好的存储大于16M的文件

  • GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中

  • GridFS 用两个集合来存储一个文件:fs.files与fs.chunks

  • 每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中

GridFS bash 命令

添加文件

1
mongofiles put xxx.txt


常用参数如下:

  • -d 指定数据库

  • -u –p 指定用户名,密码

  • -h 指定主机

  • -port 指定主机端口

  • -r 如果存在同名文件则在put成功后删除其他同名文件

下载文件

1
mongofiles get xxx.txt


  • 常用参数如下:

  • -d 指定数据库

  • -u –p 指定用户名,密码

  • -h 指定主机

  • -port 指定主机端口

  • -l 下载到本地的文件名,默认和数据库中的名字一致

删除文件

1
mongofiles delete xxx.txt


删除指定名称的文件,如果存在同名文件则都删除

常用参数如下:

  • -d 指定数据库

  • -u –p 指定用户名,密码

  • -h 指定主机

  • -port 指定主机端口

查看文件

1、list

显示所有文件

1
mongofiles list xx.txt

显示所有的指定文件名的文件

2、search

搜索指定名称的文件,可以模糊搜索

1
2
mongofiles list xx.txt
mongofiles list .txt

GridFS注意

压力以及数据量比较大的业务不推荐使用Mongo GridFS。Mongo GridFS在高并发(每秒写入10M,持续半小时到一个小时)的情况下secondary会无法catch up with primary。Mongo GridFS不是为分布式存储而设计的,它解决的问题领域是小型业务已经使MONOGODB,但是又需要存储一些文件,而且需要给这些文件加一些元信息。用它来存储图片以小文件是比较合适的。但是把它当大规模的分布式存储系统就不太合适的,那你应该用S3或者其它云存储解决方案了